package pe.edu.sistemas.postgrado.samupg.domain.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "publicacion", catalog = "bd_samupg")
public class Publicacion implements java.io.Serializable {

    private Integer publicacionId;
    private Usuario usuario;
    private String publicacionTexto;
    private Date publicacionFecha;
    private Date publicacionHora;
    private String publicacionUsuNombre;
    private String titulo;
    private String ruta_imagen;
    private List<Comentario> comentarios = new ArrayList<Comentario>(0);

    public Publicacion() {
    }

    public Publicacion(Usuario usuario) {
        this.usuario = usuario;
    }

    public Publicacion(Usuario usuario, String publicacionTexto, Date publicacionFecha, Date publicacionHora, String publicacionUsuNombre, List<Comentario> comentarios) {
        this.usuario = usuario;
        this.publicacionTexto = publicacionTexto;
        this.publicacionFecha = publicacionFecha;
        this.publicacionHora = publicacionHora;
        this.publicacionUsuNombre = publicacionUsuNombre;
        this.comentarios = comentarios;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "publicacion_id", unique = true, nullable = false)
    public Integer getPublicacionId() {
        return this.publicacionId;
    }

    public void setPublicacionId(Integer publicacionId) {
        this.publicacionId = publicacionId;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "publicacion_usu_id", nullable = false)
    public Usuario getUsuario() {
        return this.usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    @Column(name = "publicacion_texto", length = 500)
    public String getPublicacionTexto() {
        return this.publicacionTexto;
    }

    public void setPublicacionTexto(String publicacionTexto) {
        this.publicacionTexto = publicacionTexto;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "publicacion_fecha", length = 10)
    public Date getPublicacionFecha() {
        return this.publicacionFecha;
    }

    public void setPublicacionFecha(Date publicacionFecha) {
        this.publicacionFecha = publicacionFecha;
    }

    @Temporal(TemporalType.TIME)
    @Column(name = "publicacion_hora", length = 8)
    public Date getPublicacionHora() {
        return this.publicacionHora;
    }

    public void setPublicacionHora(Date publicacionHora) {
        this.publicacionHora = publicacionHora;
    }

    @Column(name = "publicacion_usu_nombre", length = 45)
    public String getPublicacionUsuNombre() {
        return this.publicacionUsuNombre;
    }

    public void setPublicacionUsuNombre(String publicacionUsuNombre) {
        this.publicacionUsuNombre = publicacionUsuNombre;
    }

    @Column(name = "publicacion_titulo", length = 80)
    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    @Column(name = "publicacion_ruta_imagen", length = 100)
    public String getRuta_imagen() {
        return ruta_imagen;
    }

    public void setRuta_imagen(String ruta_imagen) {
        this.ruta_imagen = ruta_imagen;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "publicacion")
    //@Fetch(value = FetchMode.SUBSELECT)
    @OrderBy("comentarioFecha desc, comentarioHora desc")
    public List<Comentario> getComentarios() {
        return this.comentarios;
    }

    public void setComentarios(List<Comentario> comentarios) {
        this.comentarios = comentarios;
    }
}
